package com.wei.czz.common.tool;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-07 23:03:00
 * className: PageDto 分页数据封装工具类
 * version: 1.0
 * description:
 */
@Getter
@Setter
public class PageDto<T> extends BaseEntity {

    /**
     * 总记录数
     */
    private Long totalNum;

    /**
     * 总页码数
     */
    private Long totalPage;

    /**
     * 当前页码数
     */
    private Long pageIndex;

    /**
     * 当前页显示个数
     */
    private Long limit;

    /**
     * 数据集合
     */
    private List<T> list;

    public PageDto() {
        this.totalNum = 0L;
        this.totalPage = 0L;
        this.pageIndex = 0L;
        this.limit = 0L;
        this.list = new ArrayList<>();
    }

    /**
     * 手动构造分页对象
     * @param list       数据集合
     * @param totalNum   数据总数
     * @param pageIndex  当前页码
     * @param limit      当前页显示个数
     */
    public PageDto(List<T> list, long totalNum, long pageIndex, long limit) {
        this.totalNum = totalNum;
        this.totalPage = (long) Math.ceil((double) totalNum / limit);
        this.pageIndex = pageIndex;
        this.limit = limit;
        this.list = list;
    }

    /**
     * 根据mp分页对象，构造自己的分页对象
     * @param page MybatisPlus分页对象
     */
    public PageDto(IPage<T> page) {
        this.list = page.getRecords();
        this.totalNum = page.getTotal();
        this.totalPage = page.getPages();
        this.pageIndex = page.getCurrent();
        this.limit = page.getSize();
    }

    /**
     * 判断分页数据是否为空
     */
    @JsonIgnore
    public boolean isEmpty() {
        return list == null || list.isEmpty();
    }

    /**
     * 分页数据泛型转换，并将数据列表置空
     * @return 新分页数据
     * @param <R> 泛型
     */
    @JsonIgnore
    public <R> PageDto<R> rebuild() {
        PageDto<R> pageDto = new PageDto<>();
        pageDto.totalNum = totalNum;
        pageDto.totalPage = totalPage;
        pageDto.pageIndex = pageIndex;
        pageDto.limit = limit;
        pageDto.list = Collections.emptyList();
        return pageDto;
    }

    /**
     * 分页数据列表转换
     * @return 新分页数据
     * @param <R> 泛型
     */
    @JsonIgnore
    public <R> PageDto<R> rebuild(List<R> data) {
        PageDto<R> pageDto = new PageDto<>();
        pageDto.totalNum = totalNum;
        pageDto.totalPage = totalPage;
        pageDto.pageIndex = pageIndex;
        pageDto.limit = limit;
        pageDto.list = data;
        return pageDto;
    }

    /**
     * 空分页数据
     */
    public static <R> PageDto<R> empty() {
        return new PageDto<>();
    }

}
